package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.AuditLogs;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 审计日志Mapper接口
 * 
 * @author uniflow
 * @since 1.0.0
 */
@Mapper
public interface AuditLogMapper extends BaseMapper<AuditLogs> {
    
    /**
     * 分页查询审计日志
     */
    IPage<AuditLogs> selectAuditLogPage(Page<AuditLogs> page,
                                        @Param("userId") String userId,
                                        @Param("username") String username,
                                        @Param("operationType") String operationType,
                                        @Param("resourceType") String resourceType,
                                        @Param("resourceId") String resourceId,
                                        @Param("operationResult") String operationResult,
                                        @Param("requestIp") String requestIp,
                                        @Param("startDate") LocalDateTime startDate,
                                        @Param("endDate") LocalDateTime endDate,
                                        @Param("keyword") String keyword);
    
    /**
     * 根据用户ID查询审计日志
     */
    List<AuditLogs> selectByUserId(@Param("userId") String userId,
                                   @Param("limit") Integer limit);
    
    /**
     * 根据操作类型查询审计日志
     */
    List<AuditLogs> selectByOperationType(@Param("operationType") String operationType,
                                          @Param("limit") Integer limit);
    
    /**
     * 根据资源类型查询审计日志
     */
    List<AuditLogs> selectByResourceType(@Param("resourceType") String resourceType,
                                         @Param("limit") Integer limit);
    
    /**
     * 根据资源ID查询审计日志
     */
    List<AuditLogs> selectByResourceId(@Param("resourceType") String resourceType,
                                       @Param("resourceId") String resourceId);
    
    /**
     * 根据操作结果查询审计日志
     */
    List<AuditLogs> selectByOperationResult(@Param("operationResult") String operationResult,
                                            @Param("limit") Integer limit);
    
    /**
     * 根据IP地址查询审计日志
     */
    List<AuditLogs> selectByRequestIp(@Param("requestIp") String requestIp,
                                      @Param("limit") Integer limit);
    
    /**
     * 查询指定时间范围内的审计日志
     */
    List<AuditLogs> selectByDateRange(@Param("startDate") LocalDateTime startDate,
                                      @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询今日审计日志统计
     */
    Map<String, Object> selectTodayStats();
    
    /**
     * 查询审计日志统计信息
     */
    Map<String, Object> selectAuditStats(@Param("startDate") LocalDateTime startDate,
                                         @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询操作类型统计
     */
    List<Map<String, Object>> selectOperationTypeStats(@Param("startDate") LocalDateTime startDate,
                                                       @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询资源类型统计
     */
    List<Map<String, Object>> selectResourceTypeStats(@Param("startDate") LocalDateTime startDate,
                                                      @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询用户操作统计
     */
    List<Map<String, Object>> selectUserOperationStats(@Param("startDate") LocalDateTime startDate,
                                                       @Param("endDate") LocalDateTime endDate,
                                                       @Param("limit") Integer limit);
    
    /**
     * 查询操作结果统计
     */
    List<Map<String, Object>> selectOperationResultStats(@Param("startDate") LocalDateTime startDate,
                                                         @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询IP访问统计
     */
    List<Map<String, Object>> selectIpAccessStats(@Param("startDate") LocalDateTime startDate,
                                                  @Param("endDate") LocalDateTime endDate,
                                                  @Param("limit") Integer limit);
    
    /**
     * 查询时段访问统计
     */
    List<Map<String, Object>> selectHourlyAccessStats(@Param("startDate") LocalDateTime startDate,
                                                      @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询失败操作统计
     */
    List<AuditLogs> selectFailedOperations(@Param("startDate") LocalDateTime startDate,
                                           @Param("endDate") LocalDateTime endDate,
                                           @Param("limit") Integer limit);
    
    /**
     * 查询高风险操作
     */
    List<AuditLogs> selectHighRiskOperations(@Param("startDate") LocalDateTime startDate,
                                             @Param("endDate") LocalDateTime endDate,
                                             @Param("limit") Integer limit);
    
    /**
     * 查询异常IP访问
     */
    List<Map<String, Object>> selectAbnormalIpAccess(@Param("startDate") LocalDateTime startDate,
                                                     @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询频繁操作用户
     */
    List<Map<String, Object>> selectFrequentUsers(@Param("startDate") LocalDateTime startDate,
                                                  @Param("endDate") LocalDateTime endDate,
                                                  @Param("limit") Integer limit);
    
    /**
     * 查询资源访问热度
     */
    List<Map<String, Object>> selectResourceAccessHeat(@Param("resourceType") String resourceType,
                                                       @Param("startDate") LocalDateTime startDate,
                                                       @Param("endDate") LocalDateTime endDate,
                                                       @Param("limit") Integer limit);
    
    /**
     * 查询操作趋势
     */
    List<Map<String, Object>> selectOperationTrend(@Param("operationType") String operationType,
                                                   @Param("startDate") LocalDateTime startDate,
                                                   @Param("endDate") LocalDateTime endDate,
                                                   @Param("groupBy") String groupBy);
    
    /**
     * 查询安全事件
     */
    List<AuditLogs> selectSecurityEvents(@Param("startDate") LocalDateTime startDate,
                                         @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询数据变更记录
     */
    List<AuditLogs> selectDataChanges(@Param("resourceType") String resourceType,
                                      @Param("resourceId") String resourceId);
    
    /**
     * 查询用户登录记录
     */
    List<AuditLogs> selectUserLoginLogs(@Param("userId") String userId,
                                        @Param("startDate") LocalDateTime startDate,
                                        @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询权限变更记录
     */
    List<AuditLogs> selectPermissionChanges(@Param("userId") String userId,
                                            @Param("startDate") LocalDateTime startDate,
                                            @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询系统配置变更记录
     */
    List<AuditLogs> selectConfigChanges(@Param("startDate") LocalDateTime startDate,
                                        @Param("endDate") LocalDateTime endDate);
    
    /**
     * 批量插入审计日志
     */
    int insertBatch(@Param("auditLogs") List<AuditLogs> auditLogs);
    
    /**
     * 清理过期审计日志
     */
    int deleteExpiredLogs(@Param("expireDate") LocalDateTime expireDate);
    
    /**
     * 归档审计日志
     */
    int archiveLogs(@Param("archiveDate") LocalDateTime archiveDate);
    
    /**
     * 查询审计日志总数
     */
    Long selectTotalCount();
    
    /**
     * 查询指定时间范围内的日志数量
     */
    Long selectCountByDateRange(@Param("startDate") LocalDateTime startDate,
                               @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询最大日志ID（用于增量同步）
     */
    String selectMaxLogId();
    
    /**
     * 查询增量审计日志
     */
    List<AuditLogs> selectIncrementalLogs(@Param("lastLogId") String lastLogId,
                                          @Param("limit") Integer limit);
    
    /**
     * 查询审计日志详情（包含关联信息）
     */
    AuditLogs selectWithDetails(@Param("id") String id);
    
    /**
     * 查询相关审计日志
     */
    List<AuditLogs> selectRelatedLogs(@Param("resourceType") String resourceType,
                                      @Param("resourceId") String resourceId,
                                      @Param("operationTime") LocalDateTime operationTime,
                                      @Param("timeRange") Integer timeRange);
    
    /**
     * 查询审计日志链路
     */
    List<AuditLogs> selectLogChain(@Param("traceId") String traceId);
    
    /**
     * 查询合规性报告数据
     */
    List<Map<String, Object>> selectComplianceReportData(@Param("startDate") LocalDateTime startDate,
                                                         @Param("endDate") LocalDateTime endDate,
                                                         @Param("reportType") String reportType);
}